﻿namespace FitnessTrackerCoreUnitTests
{
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using FitnessTracker.Packet;

    [TestClass]
    public class PacketVaueRangeValidationTests
    {
        #region ValidPacket
        readonly byte[] packetWithValidRanges = new byte[]
                            {
                                0x02,  // 0 STX
                                0x26,  // 1 MessageID
                                0x37,  // 2 DLC
                                0x20,  // 3
                                0x20,  // 4
                                0x20,  // 5
                                0x20,  // 6
                                0x20,  // 7
                                0x20,  // 8
                                0x20,  // 9
                                0x20,  // 10
                                0x5A,  // 11 Battery Charge 90
                                0x5A,  // 12 Heart Rate 90
                                0x5A,  // 13 Heart Beat Number 90
                                0x20,  // 14
                                0x20,  // 15
                                0x20,  // 16
                                0x20,  // 17
                                0x20,  // 18
                                0x20,  // 19
                                0x20,  // 20
                                0x20,  // 21
                                0x20,  // 22
                                0x20,  // 23
                                0x20,  // 24
                                0x20,  // 25
                                0x20,  // 26
                                0x20,  // 27
                                0x20,  // 28
                                0x20,  // 29
                                0x20,  // 30
                                0x20,  // 31
                                0x20,  // 32
                                0x20,  // 33
                                0x20,  // 34
                                0x20,  // 35
                                0x20,  // 36
                                0x20,  // 37
                                0x20,  // 38
                                0x20,  // 39
                                0x20,  // 40
                                0x20,  // 41
                                0x20,  // 42
                                0x20,  // 43
                                0x20,  // 44
                                0x20,  // 45
                                0x20,  // 46
                                0x20,  // 47
                                0x20,  // 48
                                0x20,  // 49
                                0x5A,  // 50 Distance 90
                                0x00,  // 51
                                0x5A,  // 52 Instantenious Speed 90
                                0x00,  // 53 
                                0x5A,  // 54  Strides 90
                                0x00,  // 55 
                                0x20,  // 56
                                0x20,  // 57 
                                0x20,  // 58
                                0x03   // 59 ETX
                            };
        #endregion

        #region Packet with Invalid Battery Charge Indicator
        readonly byte[] packetWithInvalidBatteryChargeIndicator = new byte[]
                            {
                                0x02,  // 0 STX
                                0x26,  // 1 MessageID
                                0x37,  // 2 DLC
                                0x20,  // 3
                                0x20,  // 4
                                0x20,  // 5
                                0x20,  // 6
                                0x20,  // 7
                                0x20,  // 8
                                0x20,  // 9
                                0x20,  // 10
                                0x65,  // 11 Battery Charge 10
                                0x5A,  // 12 Heart Rate 90
                                0x5A,  // 13 Heart Beat Number 90
                                0x20,  // 14
                                0x20,  // 15
                                0x20,  // 16
                                0x20,  // 17
                                0x20,  // 18
                                0x20,  // 19
                                0x20,  // 20
                                0x20,  // 21
                                0x20,  // 22
                                0x20,  // 23
                                0x20,  // 24
                                0x20,  // 25
                                0x20,  // 26
                                0x20,  // 27
                                0x20,  // 28
                                0x20,  // 29
                                0x20,  // 30
                                0x20,  // 31
                                0x20,  // 32
                                0x20,  // 33
                                0x20,  // 34
                                0x20,  // 35
                                0x20,  // 36
                                0x20,  // 37
                                0x20,  // 38
                                0x20,  // 39
                                0x20,  // 40
                                0x20,  // 41
                                0x20,  // 42
                                0x20,  // 43
                                0x20,  // 44
                                0x20,  // 45
                                0x20,  // 46
                                0x20,  // 47
                                0x20,  // 48
                                0x20,  // 49
                                0x5A,  // 50 Distance 90
                                0x00,  // 51
                                0x5A,  // 52 Instantenious Speed 90
                                0x00,  // 53 
                                0x5A,  // 54  Strides 90
                                0x00,  // 55 
                                0x20,  // 56
                                0x20,  // 57 
                                0x20,  // 58
                                0x03   // 59 ETX
                            };
        #endregion

        #region Packet with Invalid Heart Rate Lower Range
        readonly byte[] packetWithInvalidHeartRateLowerRange = new byte[]
                            {
                                0x02,  // 0 STX
                                0x26,  // 1 MessageID
                                0x37,  // 2 DLC
                                0x20,  // 3
                                0x20,  // 4
                                0x20,  // 5
                                0x20,  // 6
                                0x20,  // 7
                                0x20,  // 8
                                0x20,  // 9
                                0x20,  // 10
                                0x5A,  // 11 Battery Charge 90
                                0x1D,  // 12 Heart Rate 29
                                0x5A,  // 13 Heart Beat Number 90
                                0x20,  // 14
                                0x20,  // 15
                                0x20,  // 16
                                0x20,  // 17
                                0x20,  // 18
                                0x20,  // 19
                                0x20,  // 20
                                0x20,  // 21
                                0x20,  // 22
                                0x20,  // 23
                                0x20,  // 24
                                0x20,  // 25
                                0x20,  // 26
                                0x20,  // 27
                                0x20,  // 28
                                0x20,  // 29
                                0x20,  // 30
                                0x20,  // 31
                                0x20,  // 32
                                0x20,  // 33
                                0x20,  // 34
                                0x20,  // 35
                                0x20,  // 36
                                0x20,  // 37
                                0x20,  // 38
                                0x20,  // 39
                                0x20,  // 40
                                0x20,  // 41
                                0x20,  // 42
                                0x20,  // 43
                                0x20,  // 44
                                0x20,  // 45
                                0x20,  // 46
                                0x20,  // 47
                                0x20,  // 48
                                0x20,  // 49
                                0x5A,  // 50 Distance 90
                                0x00,  // 51
                                0x5A,  // 52 Instantenious Speed 90
                                0x00,  // 53 
                                0x5A,  // 54  Strides 90
                                0x00,  // 55 
                                0x20,  // 56
                                0x20,  // 57 
                                0x20,  // 58
                                0x03   // 59 ETX
                            };
        #endregion

        #region Packet with Invalid Heart Rate Upper Range
        readonly byte[] packetWithInvalidHeartRateUpperRange = new byte[]
                            {
                                0x02,  // 0 STX
                                0x26,  // 1 MessageID
                                0x37,  // 2 DLC
                                0x20,  // 3
                                0x20,  // 4
                                0x20,  // 5
                                0x20,  // 6
                                0x20,  // 7
                                0x20,  // 8
                                0x20,  // 9
                                0x20,  // 10
                                0x5A,  // 11 Battery Charge 90
                                0xF1,  // 12 Heart Rate 241
                                0x5A,  // 13 Heart Beat Number 90
                                0x20,  // 14
                                0x20,  // 15
                                0x20,  // 16
                                0x20,  // 17
                                0x20,  // 18
                                0x20,  // 19
                                0x20,  // 20
                                0x20,  // 21
                                0x20,  // 22
                                0x20,  // 23
                                0x20,  // 24
                                0x20,  // 25
                                0x20,  // 26
                                0x20,  // 27
                                0x20,  // 28
                                0x20,  // 29
                                0x20,  // 30
                                0x20,  // 31
                                0x20,  // 32
                                0x20,  // 33
                                0x20,  // 34
                                0x20,  // 35
                                0x20,  // 36
                                0x20,  // 37
                                0x20,  // 38
                                0x20,  // 39
                                0x20,  // 40
                                0x20,  // 41
                                0x20,  // 42
                                0x20,  // 43
                                0x20,  // 44
                                0x20,  // 45
                                0x20,  // 46
                                0x20,  // 47
                                0x20,  // 48
                                0x20,  // 49
                                0x5A,  // 50 Distance 90
                                0x00,  // 51
                                0x5A,  // 52 Instantenious Speed 90
                                0x00,  // 53 
                                0x5A,  // 54  Strides 90
                                0x00,  // 55 
                                0x20,  // 56
                                0x20,  // 57 
                                0x20,  // 58
                                0x03   // 59 ETX
                            };
        #endregion

        #region Packet With Invalid Distance
        readonly byte[] packetWithInvalidDistance = new byte[]
                            {
                                0x02,  // 0 STX
                                0x26,  // 1 MessageID
                                0x37,  // 2 DLC
                                0x20,  // 3
                                0x20,  // 4
                                0x20,  // 5
                                0x20,  // 6
                                0x20,  // 7
                                0x20,  // 8
                                0x20,  // 9
                                0x20,  // 10
                                0x5A,  // 11 Battery Charge 90
                                0x5A,  // 12 Heart Rate 90
                                0x5A,  // 13 Heart Beat Number 90
                                0x20,  // 14
                                0x20,  // 15
                                0x20,  // 16
                                0x20,  // 17
                                0x20,  // 18
                                0x20,  // 19
                                0x20,  // 20
                                0x20,  // 21
                                0x20,  // 22
                                0x20,  // 23
                                0x20,  // 24
                                0x20,  // 25
                                0x20,  // 26
                                0x20,  // 27
                                0x20,  // 28
                                0x20,  // 29
                                0x20,  // 30
                                0x20,  // 31
                                0x20,  // 32
                                0x20,  // 33
                                0x20,  // 34
                                0x20,  // 35
                                0x20,  // 36
                                0x20,  // 37
                                0x20,  // 38
                                0x20,  // 39
                                0x20,  // 40
                                0x20,  // 41
                                0x20,  // 42
                                0x20,  // 43
                                0x20,  // 44
                                0x20,  // 45
                                0x20,  // 46
                                0x20,  // 47
                                0x20,  // 48
                                0x20,  // 49
                                0x00,  // 50 Distance 4096
                                0x10,  // 51
                                0x5A,  // 52 Instantenious Speed 90
                                0x00,  // 53 
                                0x5A,  // 54 Strides 90
                                0x00,  // 55 
                                0x20,  // 56
                                0x20,  // 57 
                                0x20,  // 58
                                0x03   // 59 ETX
                            };
        #endregion

        #region Packet with Invalid Speed
        readonly byte[] packetWithInvalidSpeed = new byte[]
                            {
                                0x02,  // 0 STX
                                0x26,  // 1 MessageID
                                0x37,  // 2 DLC
                                0x20,  // 3
                                0x20,  // 4
                                0x20,  // 5
                                0x20,  // 6
                                0x20,  // 7
                                0x20,  // 8
                                0x20,  // 9
                                0x20,  // 10
                                0x5A,  // 11 Battery Charge 90
                                0x5A,  // 12 Heart Rate 90
                                0x5A,  // 13 Heart Beat Number 90
                                0x20,  // 14
                                0x20,  // 15
                                0x20,  // 16
                                0x20,  // 17
                                0x20,  // 18
                                0x20,  // 19
                                0x20,  // 20
                                0x20,  // 21
                                0x20,  // 22
                                0x20,  // 23
                                0x20,  // 24
                                0x20,  // 25
                                0x20,  // 26
                                0x20,  // 27
                                0x20,  // 28
                                0x20,  // 29
                                0x20,  // 30
                                0x20,  // 31
                                0x20,  // 32
                                0x20,  // 33
                                0x20,  // 34
                                0x20,  // 35
                                0x20,  // 36
                                0x20,  // 37
                                0x20,  // 38
                                0x20,  // 39
                                0x20,  // 40
                                0x20,  // 41
                                0x20,  // 42
                                0x20,  // 43
                                0x20,  // 44
                                0x20,  // 45
                                0x20,  // 46
                                0x20,  // 47
                                0x20,  // 48
                                0x20,  // 49
                                0x5A,  // 50 Distance 90
                                0x00,  // 51
                                0x00,  // 52 Instantenious Speed 4096
                                0x10,  // 53 
                                0x5A,  // 54  Strides 90
                                0x00,  // 55 
                                0x20,  // 56
                                0x20,  // 57 
                                0x20,  // 58
                                0x03   // 59 ETX
                            };
        #endregion

        #region Packet with Invalid Strides Range
        readonly byte[] packetWithInvalidStrides = new byte[]
                            {
                                0x02,  // 0 STX
                                0x26,  // 1 MessageID
                                0x37,  // 2 DLC
                                0x20,  // 3
                                0x20,  // 4
                                0x20,  // 5
                                0x20,  // 6
                                0x20,  // 7
                                0x20,  // 8
                                0x20,  // 9
                                0x20,  // 10
                                0x5A,  // 11 Battery Charge 90
                                0x5A,  // 12 Heart Rate 90
                                0x5A,  // 13 Heart Beat Number 90
                                0x20,  // 14
                                0x20,  // 15
                                0x20,  // 16
                                0x20,  // 17
                                0x20,  // 18
                                0x20,  // 19
                                0x20,  // 20
                                0x20,  // 21
                                0x20,  // 22
                                0x20,  // 23
                                0x20,  // 24
                                0x20,  // 25
                                0x20,  // 26
                                0x20,  // 27
                                0x20,  // 28
                                0x20,  // 29
                                0x20,  // 30
                                0x20,  // 31
                                0x20,  // 32
                                0x20,  // 33
                                0x20,  // 34
                                0x20,  // 35
                                0x20,  // 36
                                0x20,  // 37
                                0x20,  // 38
                                0x20,  // 39
                                0x20,  // 40
                                0x20,  // 41
                                0x20,  // 42
                                0x20,  // 43
                                0x20,  // 44
                                0x20,  // 45
                                0x20,  // 46
                                0x20,  // 47
                                0x20,  // 48
                                0x20,  // 49
                                0x5A,  // 50 Distance 90
                                0x00,  // 51
                                0x5A,  // 52 Instantenious Speed 90
                                0x00,  // 53 
                                0x81,  // 54  Strides 129
                                0x20,  // 55 
                                0x20,  // 56
                                0x20,  // 57 
                                0x20,  // 58
                                0x03   // 59 ETX
                            };
        #endregion

        [TestMethod]
        public void TestValueRanges()
        {
            Assert.IsTrue(
                HxMPacketValueRangeValidator.AreDataPointValuesInRange(this.packetWithValidRanges));
            Assert.IsFalse(
                HxMPacketValueRangeValidator.AreDataPointValuesInRange(this.packetWithInvalidBatteryChargeIndicator));
            Assert.IsFalse(
                HxMPacketValueRangeValidator.AreDataPointValuesInRange(this.packetWithInvalidHeartRateLowerRange));
            Assert.IsFalse(
                HxMPacketValueRangeValidator.AreDataPointValuesInRange(this.packetWithInvalidHeartRateUpperRange));
            Assert.IsFalse(
                HxMPacketValueRangeValidator.AreDataPointValuesInRange(this.packetWithInvalidDistance));
            Assert.IsFalse(
                HxMPacketValueRangeValidator.AreDataPointValuesInRange(this.packetWithInvalidSpeed));
            Assert.IsFalse(
                HxMPacketValueRangeValidator.AreDataPointValuesInRange(this.packetWithInvalidStrides));
        }
    }
}
